import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:hzy_normal_tool/hzy_normal_tool.dart';

import 'package:puby/models/user_model.dart';
import '../../common/index.dart';
import '../../tools/shared_preferences_tool.dart';

/// 我的页面控制器
class MineController extends BaseGetXController {
  @override
  bool get isShowAppBar => false;

  @override
  bool get safeAreatop => false;
  // 用户信息
  final Rx<UserModel?> _userInfo = Rx<UserModel?>(null);
  UserModel? get userInfo => _userInfo.value;

  // 加载状态
  final RxBool _isLoading = false.obs;
  bool get isLoading => _isLoading.value;

  // 今日患者数量
  final RxInt _todayPatients = 0.obs;
  int get todayPatients => _todayPatients.value;

  // 本月收入
  final RxDouble _monthlyIncome = 0.0.obs;
  double get monthlyIncome => _monthlyIncome.value;

  // 待处理事项数量
  final RxInt _pendingCount = 0.obs;
  int get pendingCount => _pendingCount.value;

  // 总评分
  final RxDouble _totalRating = 0.0.obs;
  double get totalRating => _totalRating.value;

  // 医师认证状态
  final RxString _certificationStatus = '未认证'.obs;
  String get certificationStatus => _certificationStatus.value;

  // 诊所审核状态
  final RxString _clinicStatus = '待审核'.obs;
  String get clinicStatus => _clinicStatus.value;

  @override
  void onInit() {
    super.onInit();
    _initData();
  }

  /// 初始化数据
  Future<void> _initData() async {
    await loadUserInfo();
    await loadStatistics();
  }

  /// 加载用户信息
  Future<void> loadUserInfo() async {
    try {
      _isLoading.value = true;

      // 检查是否已登录
      final isLoggedIn = SharedPreferencesTool.isLoggedIn();
      if (!isLoggedIn) {
        _userInfo.value = null;
        return;
      }

      // 从本地存储获取用户信息
      final userInfo = SharedPreferencesTool.getUserInfo();
      if (userInfo != null && userInfo.isNotEmpty) {
        _userInfo.value = UserModel(
          userId: userInfo['id'] ?? '',
          username: userInfo['username'] ?? '',
          phone: userInfo['phone'] ?? '',
          avatar: userInfo['avatar'] ?? 'https://via.placeholder.com/100',
          realName: userInfo['nickname'] ?? userInfo['username'] ?? '',
          gender: 1, // 默认男性
        );
        _updateCertificationStatus();
      } else {
        // 如果没有用户信息，尝试从登录信息中获取基本信息
        final loginInfo = SharedPreferencesTool.getLoginInfo();
        final username = loginInfo['username'] as String?;
        if (username != null) {
          _userInfo.value = UserModel(
            userId: loginInfo['user_id'] as String? ?? '',
            username: username,
            phone: '138****8888',
            avatar: 'https://api.dicebear.com/7.x/avataaars/svg?seed=$username',
            realName: username,
            gender: 1,
          );
          _updateCertificationStatus();
        } else {
          _loadMockUserInfo();
        }
      }
    } catch (e) {
      debugLog('加载用户信息失败: $e');
      _loadMockUserInfo();
    } finally {
      _isLoading.value = false;
    }
  }

  /// 加载统计数据
  Future<void> loadStatistics() async {
    try {
      // 这里可以调用统计数据接口
      // 暂时使用模拟数据
      _loadMockStatistics();
    } catch (e) {
      debugLog('加载统计数据失败: $e');
      _loadMockStatistics();
    }
  }

  /// 加载模拟用户信息
  void _loadMockUserInfo() {
    _userInfo.value = UserModel(
      userId: '1',
      username: '张医生',
      phone: '138****8888',
      avatar: 'https://via.placeholder.com/100',
      realName: '张医生',
      gender: 1, // 1:男 2:女
    );
    _updateCertificationStatus();
  }

  /// 加载模拟统计数据
  void _loadMockStatistics() {
    _todayPatients.value = 12;
    _monthlyIncome.value = 5680.0;
    _pendingCount.value = 5;
    _totalRating.value = 4.8;
  }

  /// 更新认证状态
  void _updateCertificationStatus() {
    // 模拟认证状态
    _certificationStatus.value = '已认证';

    // 模拟诊所审核状态
    _clinicStatus.value = '已通过';
  }

  /// 刷新数据
  Future<void> refreshData() async {
    await _initData();
  }

  /// 头像点击事件
  void onAvatarTap() {
    // TODO: 实现个人资料页面路由
    // Get.toNamed('/profile');
    debugLog('打开个人资料');
  }

  /// 认证卡片点击事件
  void onCertificationTap() {
    if (certificationStatus == '未认证') {
      // TODO: 实现认证页面路由
      // Get.toNamed('/certification');

      debugLog('认证状态: $certificationStatus');
    } else {
      Get.snackbar('提示', '您已完成医师认证');
    }
  }

  /// 患者管理点击事件
  void onPatientManagementTap() {
    // TODO: 实现患者列表页面路由
    // Get.toNamed('/patient/list');
    debugLog('打开患者管理');
  }

  /// 处方管理点击事件
  void onPrescriptionManagementTap() {
    // TODO: 实现处方列表页面路由
    // Get.toNamed('/prescription/list');
    debugLog('打开处方管理');
  }

  /// 采购订单点击事件
  void onPurchaseOrderTap() {
    // TODO: 实现采购订单页面路由
    // Get.toNamed('/purchase/orders');
    debugLog('打开采购订单');
  }

  /// 数据统计点击事件
  void onDataStatisticsTap() {
    // TODO: 实现数据统计页面路由
    // Get.toNamed('/statistics');
    debugLog('打开数据统计');
  }

  /// 个人信息点击事件
  void onPersonalInfoTap() {
    // TODO: 实现个人信息编辑页面路由
    // Get.toNamed('/profile/edit');
    debugLog('打开个人信息');
  }

  /// 账号安全点击事件
  void onAccountSecurityTap() {
    // TODO: 实现账号安全页面路由
    // Get.toNamed('/account/security');
    debugLog('打开账号安全');
  }

  /// 消息通知点击事件
  void onMessageNotificationTap() {
    // TODO: 实现消息通知设置页面路由
    // Get.toNamed('/settings/notification');
    debugLog('打开消息通知设置');
  }

  /// 设置点击事件
  void onSettingsTap() {
    // TODO: 实现设置页面路由
    // Get.toNamed('/settings');
    debugLog('打开设置');
  }

  /// 今日患者点击事件
  void onTodayPatientsTap() {
    // TODO: 实现今日患者页面路由
    // Get.toNamed('/patient/today');
    debugLog('打开今日患者');
  }

  /// 本月收入点击事件
  void onMonthlyIncomeTap() {
    // TODO: 实现本月收入页面路由
    // Get.toNamed('/income/monthly');
    debugLog('打开本月收入');
  }

  /// 待处理任务点击事件
  void onPendingTasksTap() {
    // TODO: 实现待处理任务页面路由
    // Get.toNamed('/tasks/pending');
    debugLog('打开待处理任务');
  }

  /// 总评分点击事件
  void onTotalRatingTap() {
    // TODO: 实现总评分页面路由
    // Get.toNamed('/rating/total');
    debugLog('打开总评分');
  }

  /// 帮助中心点击事件
  void onHelpCenterTap() {
    // TODO: 实现帮助中心页面路由
    // Get.toNamed('/help');
    debugLog('打开帮助中心');
  }

  /// 主题设置点击事件
  void onThemeSettingsTap() {
    // TODO: 实现主题设置页面路由
    // Get.toNamed('/settings/theme');
    debugLog('打开主题设置');
  }

  /// 语言设置点击事件
  void onLanguageSettingsTap() {
    // TODO: 实现语言设置页面路由
    // Get.toNamed('/settings/language');
    debugLog('打开语言设置');
  }

  /// 关于我们点击事件
  void onAboutTap() {
    // TODO: 实现关于我们页面路由
    // Get.toNamed('/about');
    debugLog('打开关于我们');
  }

  /// 退出登录点击事件
  void onLogoutTap() {
    // 显示确认对话框
    Get.dialog(
      AlertDialog(
        title: const Text('确认退出'),
        content: const Text('确定要退出登录吗？'),
        actions: [
          TextButton(
            onPressed: () => Get.back(),
            child: const Text('取消'),
          ),
          TextButton(
            onPressed: () {
              Get.back();
              _performLogout();
            },
            child: const Text('确定'),
          ),
        ],
      ),
    );
  }

  /// 执行退出登录
  void _performLogout() async {
    try {
      // 清除本地存储的用户信息
      SharedPreferencesTool.clearLoginInfo();

      // 清除用户状态
      _userInfo.value = null;

      // 显示退出成功提示
      Get.snackbar('提示', '退出登录成功');

      // 跳转到登录页面
      Get.offAllNamed('/login');
      debugLog('退出登录成功，跳转到登录页面');
    } catch (e) {
      debugLog('退出登录失败: $e');
      Get.snackbar('错误', '退出登录失败，请重试');
    }
  }

  /// 格式化收入显示
  String formatIncome(double income) {
    if (income >= 10000) {
      return '${(income / 10000).toStringAsFixed(1)}万';
    } else {
      return income.toStringAsFixed(0);
    }
  }

  /// 获取认证状态颜色
  Color getCertificationStatusColor() {
    switch (certificationStatus) {
      case '已认证':
        return Colors.green;
      case '审核中':
        return Colors.orange;
      default:
        return Colors.grey;
    }
  }

  /// 获取诊所状态颜色
  Color getClinicStatusColor() {
    switch (clinicStatus) {
      case '已通过':
        return Colors.green;
      case '审核中':
        return Colors.orange;
      case '已拒绝':
        return Colors.red;
      default:
        return Colors.grey;
    }
  }

  /// 更新用户头像
  Future<void> updateAvatar(String avatarPath) async {
    try {
      // 这里可以调用上传头像接口
      // final response = await MedicalApis.uploadFile(avatarPath);

      // 更新本地用户信息
      if (_userInfo.value != null) {
        _userInfo.value = _userInfo.value!.copyWith(avatar: avatarPath);
      }

      Get.snackbar('成功', '头像更新成功');
    } catch (e) {
      debugLog('更新头像失败: $e');
      Get.snackbar('错误', '头像更新失败');
    }
  }

  /// 更新个人信息
  Future<void> updateUserInfo(Map<String, dynamic> userInfo) async {
    try {
      // 这里可以调用更新用户信息接口
      // final response = await MedicalApis.updateUserInfo(userInfo);

      // 重新加载用户信息
      await loadUserInfo();

      Get.snackbar('成功', '个人信息更新成功');
    } catch (e) {
      debugLog('更新个人信息失败: $e');
      Get.snackbar('错误', '个人信息更新失败');
    }
  }

  /// 获取用户等级
  String getUserLevel() {
    // 根据用户名或其他信息判断等级
    if (userInfo?.realName?.contains('主任') == true) {
      return '高级医师';
    } else if (userInfo?.realName?.contains('主治') == true) {
      return '中级医师';
    } else {
      return '初级医师';
    }
  }

  /// 获取用户经验值
  int getUserExperience() {
    // 模拟经验值计算
    return 300;
  }

  /// 获取下一等级所需经验
  int getNextLevelExperience() {
    final currentExp = getUserExperience();
    if (currentExp < 500) {
      return 500;
    } else if (currentExp < 1000) {
      return 1000;
    } else {
      return 1500;
    }
  }
}
